package br.ucb.cesbdao.persistencia.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;

import br.ucb.cesbdao.beans.Encaminhamento;
import br.ucb.cesbdao.persistencia.AbstractConnectionDAO;
import br.ucb.cesbdao.persistencia.factory.FactoryConnection;

public class EncaminhamentoDAO extends AbstractConnectionDAO{
	
	public EncaminhamentoDAO(Connection conexao) {
		super(conexao);
	}
	public  void addEncaminhamento(Encaminhamento encaminhamento) throws ClassNotFoundException, SQLException{	
		PreparedStatement stm = getConexao().prepareStatement(sqlAdd);
		stm.setString(1, encaminhamento.getDescricao());
		stm.execute();
		FactoryConnection.getInstance().closeConexao(stm);
	}
	public  void addEncaminhamento(String descricao) throws ClassNotFoundException, SQLException{	
		PreparedStatement stm = getConexao().prepareStatement(sqlAdd);
		stm.setString(1,descricao);
		stm.execute();
		FactoryConnection.getInstance().closeConexao(stm);
	}
	public  void delEncaminhamento(int id) throws ClassNotFoundException, SQLException{ 
		PreparedStatement stm = getConexao().prepareStatement(sqlDel);
		stm.setInt(1,id);
		stm.execute();
		FactoryConnection.getInstance().closeConexao(stm);
	}
	public  Encaminhamento getByIdEncaminhamento(int id) throws SQLException, ClassNotFoundException{
		Encaminhamento encaminhamento = new Encaminhamento();
		PreparedStatement stm = getConexao().prepareStatement(sqlByIdEncaminhamento);
		stm.setInt(1, id);
		ResultSet rs = stm.executeQuery();
		if(rs.next()){
			encaminhamento = preencheEncaminhamnto(rs);
		}
		FactoryConnection.getInstance().closeConexao(stm, rs);
		return encaminhamento;
	}
	public  ArrayList<Encaminhamento> getAll() throws ClassNotFoundException, SQLException{
		Encaminhamento encaminhamento = new Encaminhamento();
		ArrayList<Encaminhamento> encaminhamentos = new ArrayList<Encaminhamento>();
		PreparedStatement stm = getConexao().prepareStatement(sqlAll);
		ResultSet rs = stm.executeQuery();
		while(rs.next()){
			encaminhamento = preencheEncaminhamnto(rs);
			encaminhamentos.add(encaminhamento);
		}
		FactoryConnection.getInstance().closeConexao(stm, rs);
		return encaminhamentos;
		
	}
	private  Encaminhamento preencheEncaminhamnto(ResultSet rs) throws SQLException {
		return new Encaminhamento(rs.getInt(1),rs.getString(2));
	}
	public  ArrayList<Encaminhamento> getByIdAtendimento(int idAtendimento) throws SQLException, ClassNotFoundException {
		ArrayList<Encaminhamento> encaminhamentos = new ArrayList<Encaminhamento>();
		PreparedStatement stm = getConexao().prepareStatement(sqlByIdAtendimento);
		stm.setInt(1, idAtendimento);
		ResultSet rs = stm.executeQuery();
		while(rs.next()){
			encaminhamentos.add(preencheEncaminhamnto(rs));
		}
		if(encaminhamentos.isEmpty())
			encaminhamentos.add(new Encaminhamento(0, "-"));
		return encaminhamentos;
	}
	
	public  ArrayList<Encaminhamento> getByNotInAtendimento(int idAtendimento) throws SQLException, ClassNotFoundException {
		ArrayList<Encaminhamento> encaminhamentos = new ArrayList<Encaminhamento>();
		PreparedStatement stm = getConexao().prepareStatement(sqlByNotInAtendimento);
		stm.setInt(1, idAtendimento);
		ResultSet rs = stm.executeQuery();
		while(rs.next()){
			encaminhamentos.add(preencheEncaminhamnto(rs));
		}
		FactoryConnection.getInstance().closeConexao(stm, rs);
		return encaminhamentos;
	}
	public  ArrayList<Encaminhamento> getByDesc(String desc) throws SQLException, ClassNotFoundException {
		String sqlByDescricao = "SELECT *FROM daoEncaminhamento WHERE descricao LIKE '%"+desc+"%';";
		ArrayList<Encaminhamento> encaminhamentos = new ArrayList<Encaminhamento>();
		PreparedStatement stm = getConexao().prepareStatement(sqlByDescricao);
		ResultSet rs = stm.executeQuery();
		while(rs.next()){
			encaminhamentos.add(preencheEncaminhamnto(rs));
		}
		FactoryConnection.getInstance().closeConexao(stm, rs);
		return encaminhamentos;
	}
	public  void upDesc(String desc, int idTipoEncaminha) throws SQLException, ClassNotFoundException {
		PreparedStatement stm = getConexao().prepareStatement(sqlUpDescricao);
		stm.setString(1,desc);
		stm.setInt(2, idTipoEncaminha);
		stm.executeUpdate();
		FactoryConnection.getInstance().closeConexao(stm);
		
	}
	public  ArrayList<Encaminhamento> getByPeriodo(Date dataInicio, Date dataFim) {
		
		return null;
	}
	
	private static final String sqlAdd = "INSERT INTO daoencaminhamento VALUES(null,?);";
	private static final String sqlDel = "DELETE FROM daoencaminhamento WHERE idTipoEncaminha = ?;";
	private static final String sqlByIdEncaminhamento = "SELECT *FROM daoencaminhamento WHERE idTipoEncaminha = ?;";
	private static final String sqlByIdAtendimento = "Select *from daoencaminhamento T, daoAtende_tipoEncaminha AT, daoAtendimento A WHERE T.idTipoEncaminha = AT.idTipoEncaminha and At.idAtendimento = A.idAtendimento and AT.idAtendimento = ?;";
	private static final String sqlAll = "SELECT *FROM daoEncaminhamento";
	private static final String sqlUpDescricao = "UPDATE daoencaminhamento SET descricao = ? WHERE idTipoEncaminha = ?;";
	private static final String sqlByNotInAtendimento = "select * from "+ 
														"daoEncaminhamento T "+
														"where "+
														"T.idTipoEncaminha "+ 
														"not in ( "+
														"Select T.idTipoEncaminha from "+ 
														"daoencaminhamento T, "+ 
														"daoAtende_tipoEncaminha AT, "+ 
														"daoAtendimento A "+ 
														"WHERE "+ 
														"T.idTipoEncaminha = AT.idTipoEncaminha and "+ 
														"At.idAtendimento = A.idAtendimento and "+ 
														"A.idAtendimento = ? "+
														");";	
	
}
